home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_asm / nnansi3 / nnansi_i.asm < prev    next >
Encoding:
Assembly Source File  |  1989-11-11  |  3.4 KB  |  142 lines

  1. ;------ nnansi_i.asm ----------------------------------------------
  2. ; Contains code only needed at initialization time.
  3. ; (C) 1986 Daniel Kegel
  4. ; May be distributed for educational and personal use only
  5. ;-----------------------------------------------------------------
  6.  
  7.     include nnansi_d.asm        ; definitions
  8.  
  9.     ; to nnansi.asm
  10.     public    dosfn0
  11.  
  12.     ; from nnansi.asm
  13.     extrn    break_handler:near
  14.     extrn    int_29:near
  15.     if    takeBIOS + fast
  16.     extrn    new_vid_bios:near
  17.     extrn    old_vid_bios:dword
  18.     endif
  19.     extrn    req_ptr:dword
  20. if    out_trans
  21.     extrn    xlate_tab_ptr:word
  22. endif
  23.     ; from nnansi_p.asm
  24.     extrn    param_buffer:word    ; adr of first byte free for params
  25.     extrn    param_end:word        ; adr of last byte used for params
  26. if key_redef
  27.     extrn    redef_end:word        ; adr of last used byte for redefs
  28. endif
  29.  
  30. code    segment byte public 'CODE'
  31.     assume    cs:code, ds:code
  32.  
  33. ;-------- dos function # 0 : init driver ---------------------
  34. ; Initializes device driver interrupts and buffers, then
  35. ; passes ending address of the device driver to DOS.
  36. ; Since this code is only used once, the buffer can be set up on top
  37. ; of it to save RAM.
  38.  
  39. dosfn0    proc    near
  40.     ; Install BIOS keyboard break handler.
  41.     xor    ax, ax
  42.     mov    ds, ax
  43.     mov    bx, 6Ch
  44.     mov    word ptr [BX],offset break_handler
  45.     mov    [BX+02], cs
  46.     ; Install INT 29 quick putchar.
  47.     mov    bx, 0a4h
  48.     mov    word ptr [bx], offset int_29
  49.     mov    [bx+2], cs
  50.     if    takeBIOS + fast
  51.     ; Install INT 10h video bios replacement.
  52.     mov    bx, 40h
  53.     mov    ax, [bx]
  54.     mov    word ptr cs:old_vid_bios, ax
  55.     mov    ax, [bx+2]
  56.     mov    word ptr cs:old_vid_bios[2], ax
  57.     mov    word ptr [bx], offset new_vid_bios
  58.     mov    word ptr [bx+2], cs
  59.     endif
  60.  
  61.     push    cs
  62.     pop    ds
  63.     push    cs
  64.     pop    es            ; es=cs so we can use stosb
  65.     cld                ; make sure stosb increments di
  66.  
  67.     ; Calculate addresses of start and end of parameter/redef buffer.
  68.     ; The buffer occupies the same area of memory as this code!
  69.     ; ANSI parameters are accumulated at the lower end, and
  70.     ; keyboard redefinitions are stored at the upper end; the variable
  71.     ; param_end is the last byte used by params (changes as redefs added);
  72.     ; redef_end is the last word used by redefinitions.
  73.     mov    di, offset dosfn0
  74.     mov    param_buffer, di
  75.     add    di, buf_size
  76.     mov    param_end, di    ; addr of last byte in free area
  77.     inc    di
  78.  
  79. IF key_redef
  80.     ; Build the default redefinition table:
  81.     ;    control-printscreen -> control-P
  82.     ; (Must be careful not to write over ourselves here!)
  83.     mov    al, 16        ; control P
  84.     stosb
  85.     mov    ax, 7200h    ; control-printscreen
  86.     stosw
  87.     mov    ax, 1        ; length field
  88.     mov    redef_end, di    ; address of last used word in table
  89.     stosw
  90. endif
  91.  
  92. if out_trans
  93.     ; Build a 1:1 output character translation table.
  94.     ; It is 256 bytes long, starts just after the param/redef buffer,
  95.     ; and is the last thing in the initialized device driver.
  96.     mov    xlate_tab_ptr, di
  97.     xor    ax, ax
  98. init_loop:
  99.     stosb
  100.     inc    al
  101.     jnz    init_loop
  102. endif
  103.  
  104.     ; Announce our presence
  105.     mov    si, offset welcome
  106. msg_loop:
  107.     lodsb    
  108.     cmp    al,0
  109.     je    msg_done
  110.     int    29h
  111.     jmp    msg_loop
  112. welcome:
  113.     db    27,'[33;1m'
  114.     db    "NNANSI.SYS for EGA/VGA"
  115.     ife    is_8088
  116.     db    " (80286)"
  117.     else
  118.     db    " (80x86)"
  119.     endif
  120.     db    13, 10
  121.     db    '(C) Daniel Kegel, Pasadena, CA 1986.'
  122.     db    13, 10
  123.     db    'Modified by Tom Almy, 11/89'
  124.     db    13, 10, 27, '[0m', 0
  125.     
  126. msg_done:
  127.  
  128.     ; Return ending address of this device driver.
  129.     ; Status is in AX.
  130.     lds    si, req_ptr
  131.     mov    word ptr [si+0Eh], di
  132.     mov    [si+10h], cs
  133.  
  134.     xor    ax, ax
  135.     ; Return exit status in ax.
  136.     ret
  137.  
  138. dosfn0    endp
  139.  
  140. code    ends
  141.     end                ; of nnansi_i.asm
  142.